package com.soulmate.img.service;

import cn.hutool.core.io.resource.InputStreamResource;
import cn.hutool.core.lang.Console;
import cn.hutool.http.HttpUtil;
import com.soulmate.img.config.FastDFSConfig;
import common.utils.UploadUtil;
import common.vo.PicUploadResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
public class ImgServiceImpl implements ImgService {
    /*@Value("${ImgServiceImpl.dir0}")
    private String dir0=null;*/
    @Autowired
    private FastDFSConfig fastDFSConfig=null;
    @Override
    public PicUploadResult uploadImg(MultipartFile pic) {
        PicUploadResult result=new PicUploadResult();
         /*
            1 . pic判断合法，通过后缀 .jpg .png .gif ...
                1.1 不合法不是图片 error 设置成1 返回数据
            2 . 生成一个公用路径
                存储路径d:/img/upload/2/d/3/d/3/d/3/d/图片.img;
                url路径：http://image.jt.com/upload/2/d/3/d/3/d/3/d/图片.img;
            3 . 拼接存储路径，重命名文件，输出图片到文件夹
            4 . 拼接url地址封装到对象数据返回
         */
         //获取文件名称，解析后缀值， test.jpg
        String oName=pic.getOriginalFilename();//获取文件原名称
        String extName=oName.substring(oName.lastIndexOf("."));
        //正则判断图片后缀 \.(jpg|png|gif|jpeg|bmp)$
        if (!extName.matches("\\.(jpg|png|gif|jpeg|bmp)$")){
            //if进来了，说明后缀不合法
            result.setError(1);
            return result;
        }//正常向下执行，后缀合法
        //生成一个公用路径 /upload/2/d/3/d/4/f/5/4 使用一个uploadUtils
         /*
         file:String 表示文件名称，图片原名
         upload:String 表示路径前缀 拼接时使用/upload/*** /pic/***

         可以根据指定的文件名称生成一个 /2/d/3/d/4/f/5/4/ 只要文件名称不变
         地址路径结构完全一样，拼接上给定的 upload前缀
         */
         String path= UploadUtil.getUploadPath(oName,"upload");
         //根据共有路径，拼接nginx管理的文件夹
        //##########把文件上传的地址放在配置文件里面。。。

        //----------------------------------------------
        //---整合go-fastdfs
        String dir0=fastDFSConfig.getDir0();
        String urlString=fastDFSConfig.getUrlString();
        //----------------------------------------------
        String dir=dir0+path+"/";
       /* String dir="D://ProgramFiles/nginx-1.17.6/static-easymall/upload/"+path+"/";*/
        //d:///upload/2/d/3/d/4/f/5/4/
        //在磁盘上生成多级路径 有则直接用没有则创建
        File fileDir=new File(dir);
        if (!fileDir.exists()){
            //if进来说明多级路径文件夹不存在
            fileDir.mkdirs();
        }
        //将图片文件输出到这个文件夹，重命名文件名称
        String newName= UUID.randomUUID().toString()+extName;
        //通过multipartfile的api输出到fileDir中
        try{

            //http://192.168.2.1:8080/group1/_search/123.TXT
           /*pic.transferTo(new File(dir+newName));*/
            //----------------------------------------------
            //---整合go-fastdfs
            this.storePicUseGoFastDFS(urlString,pic,newName,dir);

        }catch (Exception e){
            e.printStackTrace();
            result.setError(1);
            return result;
        }
       /* //拼接上可以访问到这个图片的url路径
        String url="http://image.soulmate.com/"+path+"/"+newName;
        result.setUrl(url);
        return result;*/
        /*String url="http://image.soulmate.com/"+path+"/"+newName;*/
        //返回用go-fastdfs提供的网络路径
        String url=urlString+"/"+path+"/"+newName;
        result.setUrl(url);
        return  result;



    }
    /**
     *
     * @param urlString 上传的html地址
     * @param pic 上传的文件
     * @param newName 上传的文件名称--随机生成
     * @param dir 上传的随机路径
     * @return 返回的json字符串--里面封装了以上四个参数等
     */
    public void storePicUseGoFastDFS(String urlString,MultipartFile pic,String newName,String dir){
        //
        try{
            //替换分布式代码
            InputStreamResource isr = new InputStreamResource(pic.getInputStream(),
                    pic.getOriginalFilename());

            Map<String, Object> params = new HashMap<>();
            params.put("file", isr);
            //文件名
            params.put("filename", newName);
            //场景
            params.put("scene","default");
            //自定义路径
            params.put("path",dir);
            params.put("output", "json");
            String resp = HttpUtil.post(urlString, params);
            //**
            Console.log("resp: {}", resp);
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
